#ifndef _GAME_H_
#define _GAME_H_

#include <WinDef.h>

class TextureManager;
class InputManager;
class ZoneManager;
class FontManager;
class Direct3D;
class Camera2D;
class Player;
class Goblin;

class Game
{
private:

	bool			m_GameRunning;
	int				m_WorldWidth;
	int				m_WorldHeight;
	int*			m_WorldMap;					// if either of the variables right here need to be modified, then the following need to be modified as well:
	ZoneManager*	m_ZoneManager;				// Will need to modify this apropriately to acomidate for the CManager
	Player*			m_Player;
	InputManager*	m_InputManager;
	Goblin*			m_Goblin;

	// Rendering stuff
	Direct3D*		m_D3D;
	TextureManager*	m_TM;
	FontManager*	m_FM;
	Camera2D*		m_CameraMain;

	Game(void);
	Game(const Game&);
	Game& operator =(const Game&);
	~Game(void);

	static Game*	m_GameInstance;

public:

	static Game*	GetInstance(void);

	void			Initialize(HWND _hWnd, HINSTANCE _hInstance, int _width, int _height, bool _windowed, bool _vsync);
	void			Update(void);
	void			Input(void);
	void			Render(void);
	void			Shutdown(void);

	// Creates a new map, and makes all values 01
	void			BuildMap(void);

	// Accessors
	int				GetWorldWidth(void);
	int				GetWorldHeight(void);
	int				GetWorldMapValue(const int x, const int y);
	bool			GameRunning(void);
	
	TextureManager* GetTextureManager(void);
	InputManager*	GetInputManager(void);
	ZoneManager*	GetZoneManager(void);
	FontManager*	GetFontManager(void);
	Direct3D*		GetDirect3D(void);
	Player*			GetPlayer(void);
	Goblin*			GetGoblin(void);

	// Mutators
	void			SetWorldMap(const int x, const int y, const int Type);
	void			SetWorldWidth(const int Width);
	void			SetWorldHeight(const int Height);
};

#endif